分类
联系方式
  1. 新浪微博
  2. E-mail

Maeiee Weekly No.24:爱心程序、Punk OS

媳妇最近在看一个电视剧,好像是码农主题的,其中有一个情节:注意看,大壮给小美写了一个展示爱心的程序。

媳妇连呼阿妹子嘤以及罗曼蒂克。她生日临近,说让我也写一个爱心程序送给她,生日礼物只想要这个,别的都不要。

我立马从地上弹起来,心想还有此等好事?一个小小程序就能交差,今年这是 Easy 模式啊,必须安排!

Flutter 版爱心程序

这程序在网上已经有好多实现版本了,有游戏引擎的,有科学计算的,还有视觉特效的。

我是搞移动端开发的,擅长跨端应用开发,我贡献一个使用 Flutter 开发的版本。

Flame 游戏引擎

Flame 是一个基于 Flutter 的游戏引擎。很神奇,Flutter:我一个 App 跨端框架,怎么就成跨端游戏引擎了?

Flame 有一个优势,在 User Interface 上服用 Flutter 体系,在 UI 交互上比较突出。

Flame 上手还是很快的,我之前用 SpriteKit 写过游戏,套路基本一致。值得一提的是,Flame 跟 Flutter Framework 是深度融合的,里面的很多基础类,Duration、Offset 都出自 Flutter 体系,而非自己另搞一套,给人感觉非常地道。

lixun_heart_flutter

这个程序比较简单,实际上花了半个小时就完成了。

我把项目代码放到 GitHub 上:maxiee/lixun_heart_flutter_flame

并提供了一个 Windows 版本的可执行程序,供大家直接运行体验:链接

效果演示

运行效果如下参见 GitHub 项目首页。

PunkOS

本周对 PunkOS 持续兴趣投入。这是一种我之前从未写过的、同时实现前后端的分布式跨端应用。

带来的开发体验是全新的。目前我对分层还没有想清楚,因此不论是开发、调试都非常困难。

这也是一种新奇体验。我需要不断解决难题来磨练自己的技术。但同时,我也想到了很多有趣的点子,这些点子落地,将会做出一些比较有特色的东西。

JSON RPC

首先我选择将 RPC 的实现,由自己的土制实现迁移到一条标准实现上来。

目前选择 json_rpc_2,这是一套对 JSON-RPC 2.0 spec. 的 Dart 实现,支持 Server、Client、Peer 三种工作模式。

由于 json_rpc_2 的 Demo 是基于 WebSocket 的,因为 WebSocket 在 Dart 下只有 Client 实现,没有 Server 实现,因此我一度以为无法使用 json_rpc_2。

后来发现,json_rpc_2 是传输层无关的,也可以对接 Dart 的 Unix Socket 实现,于是赶忙换上。

采用标准 RPC 协议带来的好处是巨大的。比如我的其它电脑、其它语言,都可以通过这种通用协议与 PunkOS 通信,极大的延展了它的能力。

Dart Socket 1KB 分包

在调试时,我发现大 JSON 数据结构会通信失败。后来查了一下,Dart 的 Socket 实现中,对超过 1KB 的 Message 会进行分包。

而 json_rpc_2 是通信层无关的,这个拆包合包操作应该由我来做,我没有做,于是就出现了问题。

解决的方法也很简单,Socket 是基于 Dart Stream 流式操作的,我只需要加一个终止符,在流中加入一个中间过程,按照终止符进行二次拆分即可。

RayDB

RayDB 是我使用 Dart,基于 SQLite 封装的一个 NoSQL 数据库。对上层来说,是一个 Schemaless 的 NoSQL 数据库,但是底层仍然是 SQLite。

带来的好处,是即有了 SQLite 的可靠性,又有了 NoSQL 数据库的灵活性。

创建这个项目的原因是:PunkOS 未来会将数据都存在手机上,但是找了一圈 Dart 的 NoSQL 数据库,都没有找到令我满意的。

其中 Sembast 是最贴近我需要的,但它有一个缺点,必须将全量数据载入内存,对于小数据量还好。对于我存储大量数据,规划中数十 GB 来说,是不可接收的。

我甚至也担心 SQLite 在手机上,能否可靠存储数十 GB 的数据。

PunkOS 生态

我对 PunkOS 的规划是庞大的,包含内部的窗口管理器,包含内部的系统服务,以及大量内部 App。这些 App,有些是系统自带的,有些是动态扩展的。当然,由于底层技术是 Flutter,不具备动态性,因此我未来还需要找到一种动态化的技术。

我甚至想将 Emacs 搬入 PunkOS 中,使得在 PunkOS 中,可以自己开发自己。这是我的终极愿望。

RSS 应用

理想很丰满,现实很骨感。目前我在开发 PunkOS 的第一个 APP——RayInfo,这是一个 RSS 应用。

RSS 应用首先具备一定的实用性,开发好的话,可以替代我目前再用的。

同时 RayInfo 更多也是在验证 PunkOS 中的各项功能。就当前的验证效果来说,PunkOS 还是严重缺乏设计思考,很多地方缺乏抽象,处于非常初级的阶段。

WebAssembly

本周把 《WebAssembly: The Definitive Guide》的书读完了,这本书还是不错的。

我看到 Dart 生态中也有 WebAssembly 运行时的封装,未来计划将它引入进来。

可能未来 Flutter 只是作为底层技术栈,而更多实现实在 WebAssembly 中提供的。

我也希望 WebAssembly 的 GC 提案能够快点实现,这样 Dart、Java 等 GC 语言就能落地 WebAssembly 了,同时也会有一些 Lisp 语言实现落地。